#ifndef TPITF_H
#define TPITF_H
#include "zuc/nml_intf/zucpos.h"
#include "motion/safezone.h"

/*
============================= 函数表信息 =============================
1. 获取当前工具坐标系：zucmotGetCur_Tooloffset <===> curTooloffset；
2. 获取当前基坐标系：zucmotGetCur_BaseOffset <===> curBaseOffset；
3. 获取当前用户坐标系：zucmotGetCur_UserOffset <===> curUserOffset；
4. 获取笛卡尔空间各轴加速度限制：zucmotGet_axesAccLimit <===> axesAccLimit；
5. 获取笛卡尔空间各轴速度限制：zucmotGet_axesVelLimit <===> axesVelLimit；
6. 获取关节空间各轴加速度限制：zucmotGet_JointVelLimit <===> JointVelLimit；
7. 获取关节空间各轴速度限制：zucmotGet_JointAccLimit <===> JointAccLimit；
8. 获取关节空间位置限制：zucmotGet_JointPosLimit <===> JointPosLimit；
9. 获取实际关节位置：zucmotGet_JointActPos <===> JointActPos；
10. 获取关节力矩约束：zucmotGet_JointTrqLimit <===> JointTrqLimit；
11. 获取指令关节位置：zucmotGet_JointCmdPos <===> JointCmdPos；
12. 获取关节速度方向：zucmotGet_JointVelDir <===> JointVelDir；
13. 获取disable传送带跟踪时刻笛卡尔空间规划位姿：zucmotStatGet_convyr_pos_fb <===> convyr_pos_fb；
14. 获取力柔顺模式下的实际力矩/用于终止条件检测：zucmotGetStat_jointTrqFb <===> jointTrqFb；
15. 设置力柔顺参数：zucmotStatSet_ftConfig <===> setftConfig；
16. 获取倍率模式状态：zucmotStatGet_percentageModeLevel <===> percentageModeLevel；
    获取是否处于三位置使能状态: zucmotStatGet_threePositionEnableLimit <===> threePositionEnableLimit;
    获取当前机器人是否处于力限制状态   zucmotStatGet_tcpForceLimit <===> tcpForceLimit;
17. 获取单步调试状态：zucmotGet_IsStepping <===> isStepping；
18. 获取速度倍率值：zucmotStatGet_velScale <===> velScale；
19. 获取动量限制速度倍率值：zucmotStatGet_momvelScale <===> momvelScale；
20. 获取是否处于缩减模式：zucmotStatGet_ReduceMode <===> ReduceMode；
21. 获取机器人是否处于退出传送带跟踪后的减速阶段：zucmotStatGet_still_dec <===> still_dec；
22. 获取AIO总数：zucmotGet_TotalNumAIO <===> TotalNumAIO；
23. 获取DIO总数：zucmotGet_TotalNumDIO <===> TotalNumDIO；
24. 获取IO状态：zucmot_GetIOStatus <===> IOStatus；
25. 设置DO：zucmot_SetDO <===> SetDO；
26. 设置AO：zucmot_SetAO <===> SetAO；
27. 获取TCP速度限制值：zucmot_GetCfgTcpVelLimit <===> CfgTcpVelLimit；
28. 传送带跟踪奇异预判检测：track_pre_singular <===> track_pre_singular；
29. 获取安全平面设置信息(使能、模式、平面信息等)：zucmot_GetSafeZoneImformation <===> GetSafeZoneImformation；
30. 检查点位是否处于安全区域内：zucmot_checkSafezone <===> checkSafezone；
31. 设置安全平面预判结果(减速停止是否会进入非安全区域)：zucmot_SetCheck_safezone_prediction <===> SetCheck_safezone_prediction；
32. 获取控制器周期：zucmot_GetTrajCycleTime <===> GetTrajCycleTime；
33. 传送带跟踪是否超出最大跟踪距离检查：max_distance_stop <===> max_distance_stop；
34. 设置各关节是否处于速度限制状态：zucmot_set_status_jvel_limit <===> set_status_jvel_limit；
35. 设置笛卡尔空间指令值：zucmot_set_status_cpos_cmd <===> set_status_cpos_cmd；
36. 设置笛卡尔空间规划值：zucmot_set_status_cpos_desired <===> set_status_cpos_desired；
37. 获取笛卡尔空间指令值：zucmot_get_status_cpos_cmd <===> get_status_cpos_cmd；
38. 获取笛卡尔空间反馈值：zucmot_get_status_cpos_fb <===> get_status_cpos_fb；
39. 设置关节位置指令值：zucmot_set_jointpos_cmd <===> set_jointpos_cmd；
40. 获取当前构型关节轴数：zucmotGet_numJoints <===> zucmotGet_numJoints；
    获取当前机器人系列号(0：zu/C，1：MC，2：...) zucmotconfig_robotmodel <===> get_robot_model;
    
*/

typedef struct tpInput_vtable
{
    ZucPose (*curTooloffset)();
    int (*max_planning_queue_size)();
    int (*max_fw_len)();
    PmRpy (*curBaseOffset)();
    ZucPose (*curUserOffset)();
    //joint axes constraint
    int (*axesAccLimit)(int axesIndex, double* Acclimit);
    int (*axesVelLimit)(int axesIndex, double* Vellimit);
    int (*JointVelLimit)(int jointIndex, double* vellimit);
    int (*JointAccLimit)(int jointIndex, double* Acclimit);
    int (*JointPosLimit)(int jointIndex, double* lowBound, double* upBound);
    int (*JointActPos)(int jointIndex, double* pos);
    int (*JointTrqLimit)(int jointIndex, double* trq);
    int (*JointCmdPos)(int jointIndex, double* pos);
    int (*JointVelDir)(int jointIndex, int* velDir);
    ZucPose (*convyr_pos_fb)();
    void (*jointTrqFb)(double* torque);

    double (*maxFeedScale)();
    int (*setftConfig)(int index, FtConfig ftConfig);
    int (*percentageModeLevel)();
    int (*threePositionEnableLimit)();
    int (*tcpForceLimit)();
    int (*isStepping)();
    double (*velScale)();
    double (*momvelScale)();
    unsigned char (*enables_new)();
    int (*ReduceMode)();
    int (*still_dec)();
    int (*TotalNumAIO)(char busType);
    int (*TotalNumDIO)(char busType);
    void (*RotaryUnlock)(int jnum, int unlock);
    int (*RotaryIsUnlocked)(int jnum);
    int (*IOStatus)(IODevType devtype, int di_Index, int* value);
    int (*SetDO)(IODevType devtype, int di_Index, int value);
    int (*SetAO)(IODevType devtype, int di_Index, float value);
    double (*CfgTcpVelLimit)();
    int (*track_pre_singular)();
    int (*GetSafeZoneImformation)(int* autoEnable, int* openEnable, int* safezone_Enable, int* safezone_Dengrous, int* elbow_sphere_radius, SafeZone* safezone);
    int (*checkSafezone)(SafeZone zone,
                         ZucPose curPose,
                         ZucPose cur_elbow_Pose,
                         int elbow_wrist_flag,
                         double R_elbow,
                         ZucPose current_user_offset,
                         int pre_flag,
                         checksafefalg_out* checksafefalg);
    int (*SetCheck_safezone_prediction)();
    int (*GetTrajCycleTime)(double* trajCycleTime);
    int (*max_distance_stop)();
    int (*set_status_jvel_limit)(int is_limit, int index);
    int (*set_status_cpos_cmd)(ZucPose cartPose);
    int (*set_status_cpos_desired)(ZucPose cartPose);
    int (*get_status_cpos_cmd)(ZucPose* cartPose);
    int (*get_status_cpos_fb)(ZucPose* cartPose);
    int (*set_jointpos_cmd)(double* jpos_cmd);
    int (*zucmotGet_numJoints)();
    int (*get_robot_model)();
    // void (*reportError)(int errcode, const char* fmt, ...);
} tpInput_vtable_t;

#endif